package com.andnnl.random;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

/**
 * Created by chenss on 2019/12/18.
 */
public class RandomNum {
    /**
     * 功能：产生min-max中的n个不重复的随机数(性能低)
     * <p>
     * <p>
     * <p>
     * min:产生随机数的其实位置
     * <p>
     * mab：产生随机数的最大位置
     * <p>
     * n: 所要产生多少个随机数
     */
    public static int[] randomNumber(int min, int max, int n) {
        //判断是否已经达到索要输出随机数的个数
        if (n > (max - min + 1) || max < min) {
            return null;
        }
        int[] result = new int[n]; //用于存放结果的数组
        int count = 0;
        while (count < n) {
            int num = (int) (Math.random() * (max - min)) + min;
            boolean flag = true;
            for (int j = 0; j < count; j++) {
                if (num == result[j]) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                result[count] = num;
                count++;
            }
        }
        return result;
    }

    /**
     * 功能：随机指定范围内N个不重复的数(性能比循环好)
     *
     * @param min 指定范围最小值
     * @param max 指定范围最大值(不包括)
     * @param n   随机数个数
     */
    public static int[] randomSet(int min, int max, int n) {
        Set<Integer> set = new HashSet<Integer>();
        int[] array = new int[n];
        for (; true; ) {
            // 调用Math.random()方法
            int num = (int) (Math.random() * (max - min)) + min;
            // 将不同的数存入HashSet中
            set.add(num);
            // 如果存入的数小于指定生成的个数，则调用递归再生成剩余个数的随机数，如此循环，直到达到指定大小
            if (set.size() >= n) {
                break;
            }
        }
        int i = 0;
        for (int a : set) {
            array[i] = a;
            i++;
        }
        return array;
    }

    /**
     * 功能：随机指定范围内N个不重复的数(性能比循环好)
     *
     * @param min 指定范围最小值
     * @param max 指定范围最大值(不包括)
     * @param n   随机数个数
     */
    public static int[] randomSet2(int min, int max, int n) {
        Set<Integer> set = new HashSet<>(); // 用来存放已生成的随机数
        Random random = new Random(); // 随机数生成器
        while (set.size() < n) {
            int num = random.nextInt(max - min) + min; // 生成随机数
            set.add(num); // 添加到Set中
//            set.add(RandomUtil.randomInt(min,max)); // 添加到Set中
        }
        // 将Set转换成int[]数组
        int[] array = set.stream().mapToInt(Integer::intValue).toArray();
        return array;
    }

    public static void main(String[] args) {
        long t1=System.currentTimeMillis();
//        int[] a=randomNumber(0,1000000,100000);
//        int[] a=randomSet(0,1000000,100000);
        int[] a=randomSet(0,5,5);
        long t2=System.currentTimeMillis();
        System.out.println("time:"+(t2-t1));
//        Arrays.sort(a, Collections.reverseOrder());//倒序
        for (int i : a) {
            System.out.println(i);
        }
        System.out.println();
        a=randomSet2(0,5,2);
//        Arrays.sort(a, Collections.reverseOrder());//倒序
        for (int i : a) {
            System.out.println(i);
        }


    }
}
